import { resolve } from 'node:path'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { fileURLToPath } from 'node:url'
import dts from 'vite-plugin-dts'
import VitePluginObfuscator from 'vite-plugin-javascript-obfuscator'
import ViteCleanPlugin from 'vite-plugin-clean'
export default defineConfig({
  publicDir: false,

  plugins: [
    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    //@ts-ignore
    ViteCleanPlugin({ targetFiles: 'lib' }),
    vue(),
    dts({
      outDir: './lib/types',
      // exclude: ["package.json"],
      tsconfigPath: './tsconfig.app.json',
      staticImport: false, // 静态导入所有类型声明，有助于拍平目录结构
      insertTypesEntry: false,
      copyDtsFiles: false,
      rollupTypes: true,
    }),
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url)),
    },
  },
  esbuild: {
    legalComments: 'none', // 去掉所有注释
    minifyIdentifiers: true, // 压缩变量名
    minifySyntax: true, // 压缩语法
    minifyWhitespace: true, // 压缩空格/换行
  },
  optimizeDeps: {
    noDiscovery: true,
  },
  build: {
    outDir: './lib/src',
    minify: 'terser',
    emptyOutDir: true,
    terserOptions: {
      keep_fnames: true,
      compress: {
        drop_console: true, // 去掉 console
        drop_debugger: true, // 去掉 debugger
        collapse_vars: true,
        reduce_funcs: true,
        reduce_vars: true,
        passes: 2,
      },
      mangle: {
        toplevel: true,
      },
      format: {
        beautify: false,
        comments: false, // 去掉所有注释
      },
    },
    lib: {
      entry: resolve(__dirname, 'src/index.ts'),
      name: 'tryOn',
      fileName: 'tryOn',
      formats: ['es'],
    },

    rollupOptions: {
      treeshake: true,
      external: [
        'vue',
        /^three(\/.+)?$/,
        'localforage',
        '@mediapipe/tasks-vision',
        'lodash',
        /^lodash(\/.+)?$/,
      ],
      output: {
        manualChunks(id) {
          //分包所有ts文件
          if (id.endsWith('.ts')) {
            // 取文件名（去掉路径与扩展名）
            let name = id.split('/').pop()?.split('?')[0]?.replace('.ts', '')
            if (name == 'index') {
              const paths = id.split('/')
              const firstName = paths[paths.length - 2]
              if (firstName != 'src') name = firstName
            }
            return `chunk-${name}`
          }
        },
      },
      plugins: [
        VitePluginObfuscator({
          include: [/\.(jsx?|tsx?|cjs|mjs|js)$/],
          options: {
            compact: true, // 压缩输出代码
            controlFlowFlattening: false, // 控制流平坦化
            controlFlowFlatteningThreshold: 0.75, // 平坦化概率
            deadCodeInjection: false, // 注入无用代码
            deadCodeInjectionThreshold: 0.4, // 无用代码注入概率
            debugProtection: false, // 禁止F12调试
            debugProtectionInterval: 0, // 检测调试频率
            disableConsoleOutput: false, // 禁用 console 输出
            domainLock: ['localhost'], // 限制代码仅在指定域名执行
            domainLockRedirectUrl: 'https://www.baidu.com', // 不匹配时重定向 URL
            forceTransformStrings: [], // 强制字符串加密列表
            identifierNamesCache: null, // 标识符缓存
            identifierNamesGenerator: 'hexadecimal', // 变量命名策略
            identifiersDictionary: [], // 自定义命名词典
            identifiersPrefix: '', // 标识符前缀
            ignoreImports: false, // 是否跳过 import 混淆
            inputFileName: '', // 输入文件名
            log: false, // 输出混淆日志
            numbersToExpressions: false, // 数字转表达式
            optionsPreset: 'default', // 可用 preset: 'default', 'low-obfuscation'
            renameGlobals: false, // 重命名全局变量
            renameProperties: false, // 属性名混淆
            renamePropertiesMode: 'safe', // 属性混淆模式
            reservedNames: [], // 保留的变量名
            reservedStrings: [], // 保留的字符串
            seed: 0, // 随机种子（0=随机）
            selfDefending: false, // 自我保护机制
            simplify: true, // 优化控制流平坦化后的代码
            sourceMap: false, // 生成 SourceMap
            sourceMapBaseUrl: '', // SourceMap 基路径
            sourceMapFileName: '', // SourceMap 文件名
            sourceMapMode: 'separate', // inline 或 separate
            splitStrings: false, // 拆分字符串字面量
            splitStringsChunkLength: 10, // 拆分长度
            stringArray: true, // 启用字符串数组
            stringArrayCallsTransform: true, // 转换字符串数组调用
            stringArrayCallsTransformThreshold: 0.5, // 转换比例
            stringArrayEncoding: ['base64'], // 编码方式 ['base64', 'rc4']
            stringArrayIndexesType: ['hexadecimal-number'], // 索引类型
            stringArrayIndexShift: true, // 索引偏移
            stringArrayRotate: true, // 旋转数组顺序
            stringArrayShuffle: true, // 打乱顺序
            stringArrayWrappersCount: 1, // 包装层数
            stringArrayWrappersChainedCalls: true, // 链式调用
            stringArrayWrappersParametersMaxCount: 2, // 最大参数数
            stringArrayWrappersType: 'variable', // wrapper 类型 ('variable' | 'function')
            stringArrayThreshold: 0.75, // 转换为字符串数组概率
            target: 'browser', // 目标环境
            transformObjectKeys: true, // 混淆对象 key
            unicodeEscapeSequence: false, // 转换为 Unicode 转义
          },
          exclude: [/node_modules/, /\.nuxt/],
        }),
      ],
    },
  },
})
